//
//  JHFlowLayout.m
//  CustomLayout
//
//  Created by 苗钧豪 on 16/8/3.
//  Copyright © 2016年 苗钧豪. All rights reserved.
//

#import "JHFlowLayout.h"
@interface JHFlowLayout ()
// 获取item的总数量
@property (nonatomic, assign) NSUInteger numberOfItems;
//存放每一列的高度
@property (nonatomic, retain) NSMutableArray *columnHeightsArray;
//存放 每一个item的 属性 包含 frame以及下标(x,y,w,h)
@property (nonatomic, retain) NSMutableArray *attributesArray;
@property (nonatomic , assign) NSUInteger numberOfSpace;
@property (nonatomic , assign)CGFloat width;
@end

@implementation JHFlowLayout
//获取最小高度的方法
- (CGFloat)minHeight
{
    CGFloat min = 100000;
    for (NSNumber *height in _columnHeightsArray) {
        CGFloat h = [height floatValue];
        if (min > h) {
            min = h;
        }
    }
    return min;
}

//获取最大值
- (CGFloat)maxHeight
{
    CGFloat max = 0;
    for (NSNumber *height in _columnHeightsArray) {
        CGFloat h = [height floatValue];
        if (max < h) {
            max = h;
        }
    }
    return max;
}

//获取最短列索引
- (NSUInteger)indexOfMinHeight
{
    //记录索引
    NSUInteger index = 0;
    for (int i = 0; i < [_columnHeightsArray count]; i ++) {
        //获取当前高度
        CGFloat height = [_columnHeightsArray[i] floatValue];
        if (height == [self minHeight]) {
            index = i;
            return index;
        }
    }
    return index;
}
//获取最长列的索引
- (NSInteger)p_indexForLongestColumn {
    //记录哪一列最长
    NSInteger longestIndex = 0;
    for (int i = 0; self.numberOfColimns; i ++) {
        //获取高度
        CGFloat currentHeight = [self.columnHeightsArray[i] floatValue];
        if (currentHeight == [self maxHeight]) {
            longestIndex = i;
        }
    }
    return longestIndex;
}


//重写父类的布局方法
- (void)prepareLayout
{
    [super prepareLayout];
    
    //初始化保存每一个item信息的数组
    _attributesArray = [[NSMutableArray alloc] init];
    
    //初始化 保存每一列高度的数组
    _columnHeightsArray = [[NSMutableArray alloc] initWithCapacity:self.numberOfColimns];
    
    //给列高数组里面的对象赋初值
    for (int i = 0; i < self.numberOfColimns; i ++) {
        [_columnHeightsArray addObject:@0.0];
    }
    
    //获取集合视图的宽
//    CGFloat totalWidth = 355;
    
    //创建 每个item frame中的x、y
    CGFloat x = 0;
    CGFloat y = 0;
    
    //获取分区内部有多少个需要布局的item
    NSUInteger itemCount = [self.collectionView numberOfItemsInSection:0];
    
    for (int i = 0; i < itemCount; i ++) {
        //得到集合视图中 列间隙的个数
//        NSUInteger numberOfSpace;
        
        //代理对象执行代理方法，得到 item之间的间隙大小
//        CGFloat spaceWidth = 10;
        
        //求每列的宽度，也就是每个item的width
//        CGFloat width;
        if (self.numberOfColimns == 1) {
            _width = 335 / 3 * 2;
            _numberOfSpace = 0;
        } else if (self.numberOfColimns == 2 || self.numberOfColimns == 4) {
            _width = 325 / 3;
            _numberOfSpace = 1;
        } else  {
            _width = 325 / 3;
            _numberOfSpace = 2;
        }
        
        
        //获取每一个itemSize的大小
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];
        
        //数据中原始图片大小
//        CGSize imageSize = [_delegate collectionView:self.collectionView layout:self sizeForItemAtIndexPath:indexPath];
        
        //通过 约分公式得到固定宽之后的高度是多少
        CGFloat height = _width;
        
        
        UICollectionViewLayoutAttributes *attribute = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
        
        //记录每一个item的大小和位置
        attribute.frame = CGRectMake(x, y, _width, height);
        
        //数组保存每个item的位置信息
        [_attributesArray addObject:attribute];
        
        NSLog(@"item = %d",i);
        NSLog(@"x = %.2f y = %.2f width = %.2f height = %.2f",x,y,_width,height);
        
        //求列高最小的那一列的下标
//        NSUInteger minHeightIndex = [self indexOfMinHeight];
        
        //求出最小列的高度
//        CGFloat minHeight = [_columnHeightsArray[minHeightIndex] floatValue];
        
        //求出行高
//        CGFloat lineHeight = [_delegate collectionView:self.collectionView layout:self minimumLineSpacingForSectionAtIndex:0];
        
        //上一次总的列高 加上 行高 加上新加上的item的height，才是现在这一列的总高度
        //minHeight为最小列现在的高度
        //lineHeight为行间距
        //height为新加的item的高
//        _columnHeightsArray[minHeightIndex] = [NSNumber numberWithFloat:minHeight + lineHeight + height];
        
        //重新算最小列高的下标
//        minHeightIndex = [self indexOfMinHeight];
        
        //算下一次新加的item的x和y值
        x = x + _width + 10;
        
        y = y;
    }
}

//重写这个方法，可以返回集合视图的总高度
- (CGSize)collectionViewContentSize
{
//    if (self.numberOfColimns == 1 || self.numberOfColimns == 4) {
//        return CGSizeMake(325 / 3 * 2 + 10, 325 / 3 * 2 + 10);
//    } else if (self.numberOfColimns == 2) {
//        return CGSizeMake(325 / 3 * 2 + 10, 325 / 3);
//    } else if (self.numberOfColimns == 3) {
//        return CGSizeMake(325 / 3 * 3 + 20, 325 / 3);
//    } else if (self.numberOfColimns == 5 || self.numberOfColimns == 6) {
//        return CGSizeMake(325 / 3 * 3 + 20, 325 / 3 * 2 + 10);
//    } else {
//        return CGSizeMake(325 / 3 * 3 + 20, 325 / 3 * 3 + 20);
//    }
    return CGSizeMake(100, 100);
}

//这个方法不写 集合视图显示不出来，这个方法是将保存的每个item的信息告诉集合视图，进行显示。
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    return _attributesArray;
}
@end
